const grpc =require('@grpc/grpc-js');
const message_proto = require('./proto');
const const_module = require('./const');
const {v4:uuidv4} = require('uuid');
const emailModule = require('./email');
const redis_module = require('./redis');

async function GetVerifyCode(call, callback) {
    console.log("email is ", call.request.email)
    try{
        //查询redis中是否存在该验证码
        let query_res = await redis_module.GetRedis(const_module.code_prefix+call.request.email);
        console.log("query_res is ", query_res)
        let uniqueId = query_res;
        if(query_res == null){
            uniqueId = uuidv4();
            if (uniqueId.length > 4) {
                uniqueId = uniqueId.substring(0, 4);
            } 
            //设定验证码过期时间是600秒
            console.log("code+email is = ", const_module.code_prefix+call.request.email)
            let bres = await redis_module.SetRedisExpire(const_module.code_prefix+call.request.email, uniqueId,600)
            if(!bres){
                callback(null, { email:  call.request.email,
                    error:const_module.Errors.RedisErr
                });
                return;
            }
        }
        //uniqueId = uuidv4();
        console.log("uniqueId is ", uniqueId)
        let text_str =  '您的验证码为'+ uniqueId +'请三分钟内完成注册'
        //发送邮件
        let mailOptions = {
            //发送方邮箱
            from: '2276524341@qq.com',
            to: call.request.email,
            subject: '验证码',
            text: text_str,
        };
    
        let send_res = await emailModule.SendMail(mailOptions);
        console.log("send res is ", send_res)


        callback(null, { email:  call.request.email,
            error:const_module.Errors.RedisErr
        }); 

        
 
    }catch(error){
        console.log("catch error is ", error)

        callback(null, { email:  call.request.email,
            error:const_module.Errors.Exception
        }); 
    }
     
}

function main() {
    var server = new grpc.Server()
    server.addService(message_proto.VerifyCode.service, { GetVerifyCode: GetVerifyCode})
    server.bindAsync('192.168.248.171:50051', grpc.ServerCredentials.createInsecure(), () => {
        server.start()
        console.log('grpc server started')
    })
}

main()